﻿Imports System.Security.Principal

''' <summary>
''' すべてのメンバー画面のフォームです。
''' </summary>
''' <remarks></remarks>
Public Class AllMemberList
  Inherits Page

#Region " イベントハンドラ "
  Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    If String.IsNullOrEmpty(Request.QueryString("name")) Then
      Return
    End If
    If Me.IsPostBack Then
      Return
    End If

    Me.AddChildNode()   '子ノードを追加
  End Sub
#End Region

#Region " プライベートメソッド "
  ''' <summary>
  ''' 子ノードを追加します。
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub AddChildNode()
    Using group = DomainGroup.FindByName(Request.QueryString("name"))   'グループを検索
      Dim node As New TreeNode(group.Name)
      Me.MemberTreeView.Nodes.Add(node)

      Dim members = DirectoryAccess.GetMembers(group)   'グループのメンバーを取得
      For Each member In members
        Me.AddChildNode(node, member)   '子ノードを追加
        member.Dispose()
      Next
    End Using
  End Sub

  ''' <summary>
  ''' 子ノードを追加します。
  ''' </summary>
  ''' <param name="node">子ノードを追加するノード。</param>
  ''' <param name="member">子ノードになるメンバー。</param>
  ''' <remarks></remarks>
  Private Sub AddChildNode(node As TreeNode, member As DomainObject)
    Dim childNode = CreateNode(member)  'ノードを作成
    node.ChildNodes.Add(childNode)
    If member.Category = CategoryType.Group Then
      Dim subMembers = DirectoryAccess.GetMembers(DirectCast(member, DomainGroup))  'グループのメンバーを取得
      For Each subMember In subMembers
        Me.AddChildNode(childNode, subMember)   '子ノードを追加
        subMember.Dispose()
      Next
    End If
  End Sub

  ''' <summary>
  ''' 指定したメンバーのノードを作成します。
  ''' </summary>
  ''' <param name="member">メンバー。</param>
  ''' <returns>作成したノード。</returns>
  ''' <remarks></remarks>
  Private Function CreateNode(member As DomainObject) As TreeNode
    Dim displayName As String   '表示するテキスト
    Select Case member.Category
      Case CategoryType.User
        Dim user = DirectCast(member, DomainUser)
        displayName = String.Format("{0}（{1}{2}：{3}/{4}）",
          user, user.LastName, user.FirstName, user.DisplayPath, user.Name)
      Case CategoryType.Group
        Dim group = DirectCast(member, DomainGroup)
        displayName = String.Format("{0}（{1}：{2}）", group, group.Scope, group.DisplayPath)
      Case CategoryType.Computer
        Dim pc = DirectCast(member, Computer)
        Dim sp As String = Nothing
        If pc.OperatingSystemServicePack IsNot Nothing Then
          sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP")
        End If
        displayName = String.Format("{0}（{1}{2}：{3}）", pc, pc.OperatingSystem, sp, pc.Role)
      Case Else   'CategoryType.ForeignSecurityPrincipal
        displayName = String.Format("{0}（{1}）", member, member.Name)
    End Select

    Return New TreeNode(displayName, member.Name)
  End Function
#End Region
End Class